package model

import (
	"crypto/md5"
	"encoding/hex"
	"time"

	"gorm.io/gorm"
)

// User 用户
// @Description 用户信息
// @Success 200 {object} common.Response{data=User} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /user [get]
type User struct {
	ID        uint           `json:"id" gorm:"primarykey"`                                                                // 用户ID
	Username  string         `json:"username" gorm:"type:varchar(50);unique;not null"`                                    // 用户名
	Password  string         `json:"-" gorm:"type:varchar(100);not null"`                                                 // 密码
	Nickname  string         `json:"nickname" gorm:"type:varchar(50);not null"`                                           // 昵称
	Email     string         `json:"email" gorm:"type:varchar(100)"`                                                      // 邮箱
	Phone     string         `json:"phone" gorm:"type:varchar(20)"`                                                       // 手机号
	Avatar    string         `json:"avatar" gorm:"type:varchar(255);default:/static/system/defaults/avatars/default.jpg"` // 头像
	RoleID    uint           `json:"role_id" gorm:"not null"`                                                             // 角色ID
	Role      *Role          `json:"role" gorm:"foreignKey:RoleID"`                                                       // 角色信息
	Status    int            `json:"status" gorm:"type:tinyint(1);default:1;not null"`                                    // 状态：1-启用 2-禁用
	CreatedAt time.Time      `json:"created_at"`                                                                          // 创建时间
	UpdatedAt time.Time      `json:"updated_at"`                                                                          // 更新时间
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`                                                                      // 删除时间
}

// TableName 指定表名
func (User) TableName() string {
	return "users"
}

// HashPassword 密码加密
func (u *User) HashPassword(password string) string {
	h := md5.New()
	h.Write([]byte(password))
	return hex.EncodeToString(h.Sum(nil))
}

// CheckPassword 检查密码是否正确
func (u *User) CheckPassword(password string) bool {
	return u.Password == u.HashPassword(password)
}

// BeforeCreate 创建前的钩子
func (u *User) BeforeCreate(tx *gorm.DB) error {
	if u.Password != "" {
		u.Password = u.HashPassword(u.Password)
	}

	// 设置默认头像
	if u.Avatar == "" {
		u.Avatar = "/static/system/defaults/avatars/default.jpg"
	}

	return nil
}

// BeforeUpdate 更新前的钩子
func (u *User) BeforeUpdate(tx *gorm.DB) error {
	if u.Password != "" {
		u.Password = u.HashPassword(u.Password)
	}
	return nil
}
